

public class TreeNode {

	Object element;
	TreeNode firstChild;
	TreeNode nextSibling;
	

	public TreeNode( Object x ) {
		setElement(x);
		firstChild = null;
		nextSibling = null;
	}

	public Object getElement() {
		return element;
	}

	public void setElement( Object x ) {
		element = x;
	}

	public TreeNode getNextSibling() {
		return  nextSibling;
	}

	public TreeNode getFirstChild() {
		return firstChild;
	}

	public void insertChild( TreeNode previous, TreeNode newChild ) {
		
		if (previous == null) {
		
			newChild.nextSibling = firstChild;
			
			firstChild = newChild;
		}
		else {
			
			newChild.nextSibling = previous.nextSibling;
			
			previous.nextSibling = newChild;
		}
	}

	public void removeChild( TreeNode child ) {
		
		if (firstChild == child) {
		
			firstChild = child.nextSibling;
		}
		else {

			TreeNode previous = findPrevious(child);
			
			if (previous == null) {
				throw new IllegalArgumentException();
			}
			
			previous.nextSibling = child.nextSibling;
		}
	}

	private TreeNode findPrevious( TreeNode child ) {
	
		TreeNode cur = firstChild;

		while (cur.nextSibling != child) {
			
			cur = cur.nextSibling;
		}

		return cur;
	}
	
}
